package com.example.demo.mqsever.core;

import java.io.Serializable;
import java.util.Arrays;
import java.util.UUID;

// 表示一个要传递的消息
// 需要通过网络传输，需要针对 Message 进行序列化和反序列化，利用标准库自带的序列化和反序列化操作
// 序列化：把 Java 对象转化为字节序列的过程
// Serializable接口 不需要实现方法的重写
public class Message implements Serializable {
    // 属性部分 利用一个自定义类来保存
    private BasicProperties basicProperties = new BasicProperties();
    // 正文部分（支持二进制）
    private byte[] body;

    // 使用偏移量来表示某个消息在文件中的具体位置
    // 不需要序列化，使用 transient 避免序列化
    // 约定前闭后开
    private transient long offsetBeg = 0; // 消息数据的开头距离文件开头的位置偏移(字节)
    private transient long offsetEnd = 0; // 消息数据的结尾距离文件开头的位置偏移(字节)

    //采用逻辑删除，表示该消息在文件中是否有效（0x1 有效 0x0 无效）
    private byte isValid = 0x1; // 文件操作，字节表示避免歧义

    //使用工厂对象，封装创建 Message 对象的进程（创建 + Id生成）
    public static Message createMessageWithId(String routingKey, BasicProperties basicProperties, byte[] body){
        Message message = new Message();
        if(basicProperties != null){
            message.setBasicProperties(basicProperties);
        }
        // 利用 UUID 生成唯一 id , 利用 M 来区分是消息的 id
        message.setMessageId("M-" + UUID.randomUUID());
        message.basicProperties.setRoutingKey(routingKey);
        message.body = body;
        //其余属性先不设置，此处只是初始化 Message，只初始化核心内容
        return message;
    }

    // 方便 get 消息Id
    public String getMessageId(){
        return basicProperties.getMessageId();
    }

    // 方便 set 消息Id
    public void setMessageId(String messageId){
        basicProperties.setMessageId(messageId);
    }

    // 方便 get 消息 RoutingKey
    public String getRoutingKey(){
        return basicProperties.getRoutingKey();
    }

    // 方便 set 消息 RoutingKey
    public void setRoutingKey(String routingkey){
        basicProperties.setRoutingKey(routingkey);
    }

    // 方便 get 消息 deliverMode
    public int getDeliverMode(){
        return basicProperties.getDeliverMode();
    }

    // 方便 set 消息 deliverMode
    public void setDeliverMode(int deliverMode){
        basicProperties.setDeliverMode(deliverMode);
    }


    public BasicProperties getBasicProperties() {
        return basicProperties;
    }

    public void setBasicProperties(BasicProperties basicProperties) {
        this.basicProperties = basicProperties;
    }

    public byte[] getBody() {
        return body;
    }

    public void setBody(byte[] body) {
        this.body = body;
    }

    public long getOffsetBeg() {
        return offsetBeg;
    }

    public void setOffsetBeg(long offsetBeg) {
        this.offsetBeg = offsetBeg;
    }

    public long getOffsetEnd() {
        return offsetEnd;
    }

    public void setOffsetEnd(long offsetEnd) {
        this.offsetEnd = offsetEnd;
    }

    public byte getIsValid() {
        return isValid;
    }

    public void setIsValid(byte isValid) {
        this.isValid = isValid;
    }

    @Override
    public String toString() {
        return "Message{" +
                "basicProperties=" + basicProperties +
                ", body=" + Arrays.toString(body) +
                ", offsetBeg=" + offsetBeg +
                ", offsetEnd=" + offsetEnd +
                ", isValid=" + isValid +
                '}';
    }
}
